function executeConcurrently(tasks, concurrency) {
    const results = [];
    let activeCount = 0;

    function runTask(task) {
        return new Promise((resolve, reject) => {
            try {
                Promise.resolve(task())
                    .then((result) => resolve(result))
                    .catch((error) => reject(error));
            } finally {
                activeCount--;
                if (activeCount < concurrency) {
                    nextTask();
                }
            }
        });
    }

    function nextTask() {
        if (tasks.length > 0 && activeCount < concurrency) {
            const task = tasks.shift();
            activeCount++;

            runTask(task)
                .then((result) => {
                    results.push(result);
                })
                .catch((error) => {
                    console.error(`Error in task: ${error}`);
                    results.push(error);
                });
        }
    }

    // 立即开始执行第一个任务
    nextTask();

    // 返回一个Promise，当所有任务都完成时解决
    return new Promise((resolve, reject) => {
        resolve(results);
    });
}

// 示例用法
const tasks = [() => Promise.resolve("Task 1"), () => Promise.resolve("Task 2"), () => Promise.resolve("Task 3")];
// const tasks = [
//     () => new Promise((resolve) => setTimeout(() => resolve("T1"), 1000)),
//     () => new Promise((resolve) => setTimeout(() => resolve("T2"), 2000)),
//     () => new Promise((resolve) => setTimeout(() => resolve("T3"), 3000)),
//     () => new Promise((resolve) => setTimeout(() => resolve("T4"), 500)),
// ];
const concurrency = 2;
executeConcurrently(tasks, concurrency)
    .then((results) => {
        console.log("All tasks completed with results:", results);
    })
    .catch((error) => {
        console.error("An error occurred:", error);
    });
/**
 * 在这个实现中，`executeConcurrently`函数首先定义了一个`results`数组来存储任务的结果。
 * `activeCount`变量用于跟踪当前活跃的任务数量。
 * `runTask`函数负责执行单个任务，并在任务完成时更新活跃任务计数。
 * `nextTask`函数用于选择并执行下一个任务，同时确保活跃任务的数量不超过`concurrency`指定的并发数。
 * 函数开始时，会立即调用`nextTask`来启动第一个任务。
 * 随着任务的完成，`nextTask`会被再次调用，以启动新的任务，直到所有任务都被执行完毕。
 * 最后，当所有任务都完成时，`executeConcurrently`返回的Promise将解决，其结果是一个包含所有任务结果的数组。请
 * 注意，这个函数假设每个任务返回一个Promise。如果任务不返回Promise，你需要使用`Promise.resolve`或`Promise.reject`来包装任务的返回值或错误。
 * 此外，这个函数不会拒绝任何失败的任务，而是将错误添加到结果数组中。
 * 如果你需要在任何任务失败时立即停止执行并拒绝整个操作，你需要修改`runTask`函数中的`catch`块来调用`reject`。
 */
